package com.zjyd.douyangsearch.listener;

import com.alibaba.nacos.shaded.com.google.gson.Gson;
import com.zjyd.douyangsearch.mapper.NewsMapper;
import com.zjyd.douyangsearch.mode.NewsEs;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 普通消费者：订阅 "demo-topic" 主题的所有消息
 */
@Slf4j
@Component  // 交给 Spring 管理
// 注解声明订阅关系：主题、消费者组、消费模式（默认集群模式）
@RocketMQMessageListener(
        topic = "news-sjy-topic",        // 要订阅的主题（和生产者发送的主题一致）
        consumerGroup = "my-consumer-group",  // 消费者组（必须配置）
        consumeMode = ConsumeMode.CONCURRENTLY  // 并发消费（默认，效率高）
)
public class NewsConsumer implements RocketMQListener<String> {

    @Autowired
    private NewsMapper newsMapper;

    /**
     * 消息消费逻辑（消息到达后自动触发）
     * @param message 消息内容（和生产者发送的 payload 类型一致，这里是 String）
     */
    @Override
    public void onMessage(String message) {
        try {
            // 业务处理：这里模拟处理消息
            log.info("普通消费者收到消息：" + message);

            // 定义一个索引，把新闻的信息给ES
            // 课堂练习，把数据同步给es产生索引，然后写一个搜索新闻的接口，同时分词索标题和内容
            Gson gson = new Gson();
            //json转对象 要求，字段名必须对应
            NewsEs newsEs = gson.fromJson(message, NewsEs.class);
            //插入到索引里面
            newsMapper.insert(newsEs);
        } catch (Exception e) {
            // 消费失败处理：可记录日志、手动重试或丢弃（根据业务决定）
            log.error("消费消息失败，消息内容：" + message + "，异常：" + e.getMessage());
            // 若需要重试，可抛出异常（RocketMQ 会自动重试，默认最多 16 次）
            throw new RuntimeException("消费失败，触发重试", e);
        }
    }
}